#include "head.h"
#include <ncurses.h>

// 显示菜单并获取用户选择
int display_menu(const wchar_t *title, const wchar_t *choices[], int n_choices)
{
    // 设置语言环境，确保可以处理多字节字符（如中文）
    setlocale(LC_ALL, "");

    // 初始化 ncurses 库
    initscr();
    clear();
    noecho();
    cbreak();
    curs_set(0);

    int highlight = 1;
    int choice = 0;
    int c; // 使用int而不是char，以处理ncurses中的特殊键值

    // 创建窗口用于显示菜单，设置窗口大小为全屏
    WINDOW *menu_win = newwin(LINES, COLS, 0, 0);
    keypad(menu_win, TRUE);

    update_menu(menu_win, title, highlight, choices, n_choices); // 显示菜单

    // 菜单交互循环
    while (1)
    {
        c = wgetch(menu_win);
        switch (c)
        {
        case KEY_UP:
            highlight = (highlight == 1) ? n_choices : highlight - 1;
            break;
        case KEY_DOWN:
            highlight = (highlight == n_choices) ? 1 : highlight + 1;
            break;
        case 10: // Enter 键
            choice = highlight;
            break;
        default:
            break;
        }
        update_menu(menu_win, title, highlight, choices, n_choices);
        if (choice != 0) // 如果按了回车键，则退出循环
            break;
    }

    // 结束 ncurses 模式
    endwin();

    return choice; // 返回用户选择的选项值
}

// 更新并显示菜单
void update_menu(WINDOW *menu_win, const wchar_t *title, int highlight, const wchar_t *choices[], int n_choices)
{
    int x, y;

    // 计算标题的水平居中位置，并稍微向上移动
    int title_y = 2;                                                      // 标题的位置固定在上面
    int title_x = ((COLS - wcslen(title) - (wcslen(title) / 4)) / 2) - 2; // 计算标题的水平居中位置，留出 * * 的位置

    // 绘制标题及其修饰
    for (size_t i = 0; i < COLS; i++)
    {
        mvwprintw(menu_win, title_y - 1, i, "*", title);
        mvwprintw(menu_win, title_y + 1, i, "*", title);
    }

    mvwprintw(menu_win, title_y, title_x, " %ls ", title);

    // 计算菜单项的起始行位置，确保其在标题下方居中显示
    int start_y = (LINES - n_choices) / 2;

    // 绘制菜单项
    box(menu_win, 0, 0);
    for (int i = 0; i < n_choices; ++i)
    {
        y = start_y + i;                     // 逐行打印菜单项
        x = (COLS - wcslen(choices[i])) / 2; // 计算每个菜单项的水平居中位置

        if (highlight == i + 1)
        {
            wattron(menu_win, A_REVERSE | A_BOLD); // 高亮并加粗当前选项
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
            wattroff(menu_win, A_REVERSE | A_BOLD);
        }
        else
        {
            mvwprintw(menu_win, y, x, "%ls", choices[i]);
        }
    }

    wrefresh(menu_win);
}

void paintWindow(char *username, char *password, int max_length)
{
    int ch, i = 0;
    int username_x, password_x;

    // 设置语言环境，确保可以处理多字节字符（如中文）
    setlocale(LC_ALL, "");

    // 初始化ncurses模式
    initscr();
    noecho();             // 关闭回显
    curs_set(0);          // 隐藏光标
    keypad(stdscr, TRUE); // 允许键盘映射

    // 创建一个新窗口（这里我们直接使用整个屏幕作为“窗口”）
    // 实际上，我们可以通过newwin来创建一个更小的窗口，但为了简单起见，这里不这样做

    // 计算提示词居中位置
    username_x = WINDOW_START_X + (WINDOW_WIDTH - strlen("请输入账号") - 2) / 2;
    password_x = WINDOW_START_X + (WINDOW_WIDTH - strlen("请输入密码") - 2) / 2;

    // 绘制标题和提示词
    mvprintw(WINDOW_START_Y, WINDOW_START_X + (WINDOW_WIDTH - strlen("翔宇智控中心")) / 2, "翔宇智控中心");
    mvprintw(WINDOW_START_Y + 3, username_x - 13, "请输入账号：");
    mvprintw(WINDOW_START_Y + 6, password_x - 13, "请输入密码：");

    // 刷新屏幕以显示所有内容
    refresh();

    // 用户名输入
    move(WINDOW_START_Y + 3, username_x - 18);
    while (1)
    {
        ch = getch();
        if (ch == 10 || ch == KEY_ENTER)
            break;
        if (ch == KEY_BACKSPACE && i > 0)
        {
            i--;
            mvaddch(WINDOW_START_Y + 3, username_x - 1 + i, ' ');
        }
        else if ((ch >= ' ' && ch <= '~') && i < max_length)
        {
            mvaddch(WINDOW_START_Y + 3, username_x - 1 + i, ch);
            username[i++] = ch;
        }
    }
    username[i] = '\0';

    // 密码输入（以'*'显示）
    move(WINDOW_START_Y + 6, password_x - 15);
    i = 0;
    while (1)
    {
        ch = getch();
        if (ch == 10 || ch == KEY_ENTER)
            break;
        if (ch == KEY_BACKSPACE && i > 0)
        {
            i--;
            mvaddch(WINDOW_START_Y + 6, password_x - 1 + i, ' ');
        }
        else if ((ch >= ' ' && ch <= '~') && i < max_length)
        {
            mvaddch(WINDOW_START_Y + 6, password_x - 1 + i, '*');
            password[i++] = ch;
        }
    }
    password[i] = '\0';

    // 结束ncurses模式
    endwin();
    return;
}
// void fiuytir    tyureeuytir
// 登录飞机界面
void fi()
{
    int x = 10, y = 0; // 初始位置
    char plane[] = "********\n"
                   "************\n"
                   "####....#.\n"
                   "#..###.....##....\n"
                   "###.......######              ###            ###\n"
                   "  ...........               #...#          #...#\n"
                   " ##*#######                 #.#.#          #.#.#\n"
                   " ####*******######             #.#.#          #.#.#\n"
                   " ...#***.****.*###....          #...#          #...#\n"
                   " ....**********##.....           ###            ###\n"
                   " ....****    *****....\n"
                   "   ####        ####\n"
                   " ######        ######\n";
    initscr();   // 初始化ncurses模式
    noecho();    // 不回显输入的字符
    curs_set(0); // 隐藏光标
    int num = 90;
    while (1)
    {
        clear(); // 清除屏幕
        // 注意：mvprintw 需要逐行打印，因为 ncurses 不支持直接打印多行字符串
        mvprintw(y, x, "      ********");
        mvprintw(y + 1, x, "     ************");
        mvprintw(y + 2, x, "     ####....#");
        mvprintw(y + 3, x, "   #..###.....##....");
        mvprintw(y + 4, x, "   ###.......######              ###            ###");
        mvprintw(y + 5, x, "      ...........               #...#          #...#");
        mvprintw(y + 6, x, "     ##*#######                 #.#.#          #.#.#");
        mvprintw(y + 7, x, "  ####*******######             #.#.#          #.#.#");
        mvprintw(y + 8, x, " ...#***.****.*###....          #...#          #...#");
        mvprintw(y + 9, x, " ....**********##.....           ###            ###");
        mvprintw(y + 10, x, " ....****    *****....");
        mvprintw(y + 11, x, "   ####        ####");
        mvprintw(y + 11, x, " ######        ######");
        refresh(); // 刷新屏幕显示
        num--;
        if (0 == num)
        {
            break;
        }
        // 更新飞机位置
        x++;
        if (x >= COLS - strlen(plane))
        { // 注意：这里应该使用飞机最宽部分的长度
            // 但由于我们逐行打印，且每行长度可能不同，这里简化为使用最长行的长度
            // 在这个例子中，最长行是 "  ___   "，所以长度为 7
            if (x >= COLS - 7)
            {
                x = 0;
            }
        }
        usleep(40000); // 暂停一段时间（微秒），调整这个值以改变动画速度

        // 可以在这里添加按键检测来退出循环或改变动画行为
        // ...
    }

    endwin(); // 退出ncurses模式
}

// 进度条
void Progress_Bar(int x, int y, float time_length)
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = ((time_length / 100) * flag) * 100;
        printf("%.2f%%\n", percent);
        temp += 0.01;
        flag += 0.01;
        if (fabs((flag - 0.01) - time_length) < EPSILON)
        {
            break;
        }

        fflush(stdout);
        usleep(4000);
        system("clear");
    }
    system("clear");
}
